#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void handler(int signo)
{
    cout << "收到信号：" << signo << " 导致程序运行崩溃" << endl;
    exit(-1);
}

void showBlock(sigset_t *set)
{
    int signo = 31;
    while (signo > 0)
    {
        if (sigismember(set, signo))
            cout << "1"; // 信号阻塞，输出1
        else
            cout << "0"; // 否则输出0
        signo--;
    }
    cout << endl;
}

int main()
{
    sigset_t set, oset;
    sigemptyset(&set); // 设置为空
    sigemptyset(&oset);

    sigaddset(&set, 2); // 设置2号信号为阻塞状态

    sigprocmask(SIG_SETMASK, &set, &oset);

    int cnt = 0;
    while (true)
    {
        showBlock(&oset);
        sleep(1);
        cnt++;

        if (cnt == 5)
        {
            cout << "recover block" << endl;
            sigprocmask(SIG_SETMASK, &oset, &set); // 取消信号阻塞状态，信号递达
            showBlock(&set);
        }
    }

    return 0;
}

// int main()
// {
//     //除0
//     // signal(8, handler); //除0报错信号 SIGFPE 8号
//     //int a = 10;
//     // a /= 0;

//     //空指针解引用
//     //signal(11, handler);    //空指针解引用 SIGSEGV 11号
//     int* p = nullptr;
//     //p = (int*)100;    //不报错
//     *p = 100;   //空指针解引用
//     return 0;
// }